/*
541. 反转字符串 II
. 简单

给定一个字符串 s 和一个整数 k，从字符串开头算起，每计数至 2k 个字符，就反转这 2k 字符中的前 k 个字符。

如果剩余字符少于 k 个，则将剩余字符全部反转。
如果剩余字符小于 2k 但大于或等于 k 个，则反转前 k 个字符，其余字符保持原样。
*/

#include <iostream>
#include <vector>

using namespace std;

class Solution {
public:
    string reverseStr(string s, int k) 
    {
        int add_num = 0;
        
        auto end = s.end()-1;
        auto tag_left=s.begin();
        
        while (true)
        {
            auto left = tag_left;
            if(end-left>=k-1)
            {
                auto right=tag_left+k-1;
                add_num++;
                if(add_num%2==1)
                {
                    //交换这K个元素。
                    while(left<right)
                    {
                        char temp = *right;
                        *right = *left;
                        *left = temp;
                        left++;
                        right--;
                    }

                }
                tag_left += k;
            }
            else if(add_num%2==0)
            {
                //交换剩余的这些元素
                auto right=s.end()-1;
                while(tag_left<right)
                {
                    char temp = *right;
                    *right = *tag_left;
                    *tag_left = temp;
                    tag_left++;
                    right--;
                }  
                break;              
            }
            else{
                break;
            }
        }
        return s;
    }
};
  
int main()
{
    Solution sl;
    string str=sl.reverseStr("abcd",2);
    cout << str;
    return 0;
}